// #include "include/muduo/net/TcpServer.h"
// #include "include/muduo/net/EventLoop.h"
// #include "include/muduo/net/TcpConnection.h"
#include "muduo/net/TcpServer.h"
#include "muduo/net/EventLoop.h"
#include "muduo/net/TcpConnection.h"
#include <iostream>
#include <string>
#include <functional>
#include <unordered_map>


class TranslateServer
{
public:
    TranslateServer(int port) : _server(&_baseloop, muduo::net::InetAddress("0.0.0.0", port), 
        "TranslateServer", muduo::net::TcpServer::kReusePort)
    {
        // 将类成员函数设置为服务器的回调处理函数
        _server.setConnectionCallback(std::bind(&TranslateServer::OnConnection, this, std::placeholders::_1));
        _server.setMessageCallback(std::bind(&TranslateServer::OnMessage, this, std::placeholders::_1, 
            std::placeholders::_2, std::placeholders::_3));
    }

    void Start()
    {
        // 开始事件监听
        _server.start();
        // 开始事件监控，死循环阻塞接口
        _baseloop.loop();
    }

private:
    // OnConnection应该是在一个连接建立成功以及关闭时被调用
    void OnConnection(const muduo::net::TcpConnectionPtr &conn)
    {
        if(conn->connected() == true)
        {
            std::cout << "新连接建立成功！" << std::endl;
        }
        else
        {
            std::cout << "连接关闭！" << std::endl;
        }

    }

    std::string Translate(std::string &str)
    {
        static std::unordered_map<std::string, std::string> dict_map{
            {"hello", "你好"},
            {"Hello", "你好"},
            {"吃了吗", "油泼面"}
        };
        auto it = dict_map.find(str);
        if(it == dict_map.end())
        {
            return "不到啊";
        }
        return it->second;
    }

    // 通信连接收到请求时的回调函数
    void OnMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp time)
    {
        // 1. 从buf中把请求的数据取出来
        std::string str = buf->retrieveAllAsString();
        // 2. 调用Translate接口进行翻译
        std::string resp = Translate(str);
        // 3. 对客户端进行响应结果
        conn->send(resp);
    }


private:
    // _baseloop是epoll的事件监控，会进行描述符的事件监控，触发事件后进行IO操作
    muduo::net::EventLoop _baseloop;
    // _server用于设置回调函数，用于告诉服务器收到请求该如何处理
    muduo::net::TcpServer _server;
};

int main()
{
    TranslateServer trans_server(8081);
    trans_server.Start();


    return 0;
}